package Thread_study.thread_synchronized_method;

public class Account {
    private String cardId;
    private double money;

    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    /**
     *  小明 小红
     *  this == acc
     *  同步方法底层原理:
     *  同步方法底层其实也是有隐式锁对象的,只是锁的范围是整个方法代码
     *  如果方法是实例方法:同步方法默认使用this作为锁对象,但是代码要高度面向对象
     *  如果方法是静态方法:同步方法默认使用类名.class作为锁对象
     *
     *  小结:
     *      同步代码块锁的范围更小,同步方法锁的范围更大 (范围小的话性能会好一点)
     *      但实际开发同步方法锁用的稍多
     */
    public synchronized void drawMoney(double money) {
        // 0.先获取是谁来取钱
        String name = Thread.currentThread().getName();
        // 1.判断账户是否够钱
        if (this.money >= money) {
            // 2.取钱
            System.out.println(name + "来取钱成功,吐出" + money);
            // 3.更新余额
            this.money -= money;
            System.out.println(name + "取钱后:" + this.money);
        } else {
            // 4.余额不足
            System.out.println(name + "来取钱,余额不足");
        }

    }
}
